Outline

Meta-Classes

Guy Wiener

Introduction AOP Classes Generation 1 Introduction Meta-Classes in Python Logging 2 Meta-Classes in Python Delegation Meta-Classes vs. Traditional OOP 3 Meta-Classes vs. Traditional OOP Outline

Meta-Classes

Guy Wiener

Introduction AOP Classes Generation 1 Introduction Meta-Classes in Python Logging 2 Meta-Classes in Python Delegation Meta-Classes vs. Traditional OOP 3 Meta-Classes vs. Traditional OOP What is Meta-Programming?

Meta-Classes Definition Guy Wiener Meta-Program A program that: Introduction AOP Classes One of its inputs is a program Generation (possibly itself) Meta-Classes in Python Its output is a program Logging Delegation Meta-Classes vs. Traditional OOP Meta-Programs Nowadays

Meta-Classes

Guy Wiener

Introduction AOP Classes Generation Compilers Meta-Classes in Python Code Generators Logging Delegation Model-Driven Development Meta-Classes vs. Traditional Templates OOP Syntactic macros (Lisp-like) Meta-Classes The Problem With Static Programming

Meta-Classes

Guy Wiener

Introduction AOP Classes Generation Meta-Classes How to share features between classes and class hierarchies? in Python Logging Share static attributes Delegation Meta-Classes Force classes to adhere to the same protocol vs. Traditional OOP Share code between similar methods Meta-Classes

Meta-Classes

Guy Wiener

Introduction AOP Classes Definition Generation Meta-Classes in Python Meta-Class A class that creates classes Logging Delegation Objects that are instances of the same class Meta-Classes share the same behavior vs. Traditional OOP Classes that are instances of the same meta-class share the same behavior Meta-Classes

Meta-Classes

Guy Wiener

Introduction AOP Classes Definition Generation Meta-Classes in Python Meta-Class A class that creates classes Logging Delegation Objects that are instances of the same class Meta-Classes share the same behavior vs. Traditional OOP Classes that are instances of the same meta-class share the same behavior

Classes create objects ⇒ Meta-classes create classes Aspect-Oriented Programming (AOP)

Meta-Classes Guy Wiener A meta-programming methodology based on OOP Introduction Goal: Make all methods that match a pattern adhere to AOP Classes the same behavior (called “ advice ”) Generation Meta-Classes in Python Logging Examples Delegation Meta-Classes vs. Traditional Print logging OOP Perform a security check Ask for permission . . . Aspect-Oriented Programming (AOP)

Meta-Classes Guy Wiener A meta-programming methodology based on OOP Introduction Goal: Make all methods that match a pattern adhere to AOP Classes the same behavior (called “ advice ”) Generation Meta-Classes in Python Logging Examples Delegation Meta-Classes vs. Traditional Print logging OOP Perform a security check Ask for permission . . .

Function decorators are not enough We want to enforce a policy. AOP Example

Meta-Classes

Guy Wiener Advice Code

Introduction AOP if (!connected) class Client { Classes Generation connect(); void send(server) { Meta-Classes in Python // send message Logging Delegation } Meta-Classes void receive(server) { vs. Traditional OOP // receive message } } AOP Example

Meta-Classes

Guy Wiener Advice Code

Introduction AOP if (!connected) class Client { Classes Generation connect(); void send(server) { Meta-Classes in Python if (!connected) Logging Delegation connect(); Meta-Classes // send message vs. Traditional OOP } void receive(server) { if (!connected) connect(); // receive message } } AOP Programs

Meta-Classes

Guy Wiener

Introduction AOP Components of an AOP meta-program Classes Generation Meta-Classes in Python Advices Shared code Logging Delegation Patterns Which advice applies to which points in the code Meta-Classes (entry or exit of a method) vs. Traditional OOP AOP Programs

Meta-Classes

Guy Wiener

Introduction AOP Components of an AOP meta-program Classes Generation Meta-Classes in Python Advices Shared code Logging Delegation Patterns Which advice applies to which points in the code Meta-Classes (entry or exit of a method) vs. Traditional OOP Input A program and specifications Output A new program Applying an AOP program on a Program

Meta-Classes A generic meta-class for AOP Guy Wiener

Introduction Input: class C, advice a, pattern p AOP Output: class C, modified Classes Generation for method m ∈ methods( C) do Meta-Classes in Python if m matches p then Logging Delegation m’ = apply a on m Meta-Classes replace m with m’ in C vs. Traditional OOP end if end for Applying an AOP program on a Program

Meta-Classes A generic meta-class for AOP Guy Wiener

Introduction Input: class C, advice a, pattern p AOP Output: class C, modified Classes Generation for method m ∈ methods( C) do Meta-Classes in Python if m matches p then Logging Delegation m’ = apply a on m Meta-Classes replace m with m’ in C vs. Traditional OOP end if end for

Requires:

Reflection Modification AOP Example

Meta-Classes

Guy Wiener

Introduction AOP An aspect for connecting to a server Classes Generation for method m ∈ Client do Meta-Classes in Python if m has an argument server then Logging Delegation insert Meta-Classes if (!connected) vs. Traditional “ OOP connect();” before m end if end for The RMI Problem

Meta-Classes Remove Method Invocation (RMI) Guy Wiener

Introduction A server object is located on one computer AOP Classes Clients invokes methods of the server object from other Generation Meta-Classes computers in Python Logging Delegation Meta-Classes vs. Traditional start() OOP stop() Server Object

pause(5)

Figure: Remote Method Invocation RMI Class Diagram

Meta-Classes

Guy Wiener ServerInf Introduction AOP start()* Classes Generation stop()* pause(int)* Meta-Classes in Python Server Logging Delegation start() Meta-Classes stop() vs. Traditional pause(int) OOP Server+ Figure: The original Server start()+ class stop()+ pause(int)+

Figure: Server class and RMI Class Diagram (cont’d)

Meta-Classes

Guy Wiener ServerInf Introduction AOP start()* Classes Generation stop()* pause(int)* Meta-Classes in Python Logging Delegation Meta-Classes vs. Traditional Stub+ Skeleton+ ServerImpl+ OOP over start()+ start()+ start()+ stop()+ network stop()+ stop()+ pause(int)+ pause(int)+ pause(int)+

Figure: Server with stub and skeleton RMI Classes Generation

Meta-Classes

Guy Wiener ServerInf

Introduction start()* AOP stop()* Classes pause(int)* Generation Meta-Classes Generated Classes: in Python Logging Delegation Input: Meta-Classes Code Generator vs. Traditional Server interface OOP Output: Skeleton Stub Stub+ Skeleton+

start()+ start()+ stop()+ stop()+ pause(int)+ pause(int)+

Figure: Classes generation for RMI Object-Oriented Code Generation

Meta-Classes

Guy Wiener Input Class definitions Introduction AOP Classes Interfaces, IDL Generation UML Meta-Classes in Python Other specifications Logging Delegation Output Generated classes Meta-Classes vs. Traditional Stubs and skeletons OOP Persistent objects Database tables . . . Object-Oriented Code Generation

Meta-Classes

Guy Wiener Input Class definitions Introduction AOP Classes Interfaces, IDL Generation UML Meta-Classes in Python Other specifications Logging Delegation Output Generated classes Meta-Classes vs. Traditional Stubs and skeletons OOP Persistent objects Database tables . . . The structure of the program becomes the source for automatically generated code Outline

Meta-Classes

Guy Wiener

Introduction AOP Classes Generation 1 Introduction Meta-Classes in Python Logging 2 Meta-Classes in Python Delegation Meta-Classes vs. Traditional OOP 3 Meta-Classes vs. Traditional OOP Motivation

Meta-Classes

Guy Wiener Problem Introduction AOP Classes Generation Python’s flexibility makes the code impossible to Meta-Classes understand in Python Logging A more organized mechanism is required Delegation Meta-Classes vs. Traditional OOP Motivation

Meta-Classes

Guy Wiener Problem Introduction AOP Classes Generation Python’s flexibility makes the code impossible to Meta-Classes understand in Python Logging A more organized mechanism is required Delegation Meta-Classes vs. Traditional OOP The OOP Solution

Class in Python are objects Objects are instances of classes Motivation

Meta-Classes

Guy Wiener Problem Introduction AOP Classes Generation Python’s flexibility makes the code impossible to Meta-Classes understand in Python Logging A more organized mechanism is required Delegation Meta-Classes vs. Traditional OOP The OOP Solution

Class in Python are objects Objects are instances of classes Classes are instances of Meta-Classes Meta-Classes in Python

Meta-Classes

Guy Wiener

Introduction AOP Classes Generation Meta-Classes Meta-Classes in Python Logging Extend the type “ type” Delegation Meta-Classes Responsible for creating new classes vs. Traditional OOP The dynamic members of the meta-class become static members of the instance class Creating Classes from Meta-Classes

Meta-Classes Example Guy Wiener

Introduction AOP # Meta-Class Classes Generation class Printable(type): Meta-Classes def whoami(self): print "I am ", self.__name__ in Python Logging Delegation Meta-Classes >>> Foo = Printable(’Foo’,(),{}) # Empty new class vs. Traditional OOP >>> Foo.whoami() I am Foo >>> Foo.__class__ >>> f = Foo() # Object >>> f.__class__ The field

Meta-Classes

Guy Wiener

Introduction AOP Classes Generation Class C is an instance of a meta-class M if: Meta-Classes in Python 1 Logging C has a static field metaclass Delegation 2 One of the ancestors classes of C is an instance of M Meta-Classes vs. Traditional OOP 3 There is a global variable metaclass 4 Otherwise, the default meta-class type is used metaclass Example

Meta-Classes

Guy Wiener Declaring a meta-class with metaclass Introduction AOP Classes Generation class Bar: Meta-Classes in Python __metaclass__ = Printable Logging Delegation def foo(self): print ’foo’ Meta-Classes vs. Traditional OOP >>> Bar.whoami() I am a Bar >>> b = Bar() >>> b.foo() foo The

Meta-Classes

Guy Wiener The constructor of the “ type” class creates new classes based Introduction AOP on the class declaration: Classes Generation type. init (cls, name, bases, dict) Meta-Classes in Python Logging Delegation cls The class object itself (like “ self” in other Meta-Classes methods) vs. Traditional OOP name The name of the class bases A list of the base classes dict A dictionary of the methods and static fields of the class What You Can Do With It?

Meta-Classes

Guy Wiener

Introduction AOP The type constructors allow to manipulate the created class : Classes Generation Meta-Classes type. init (cls, name, bases, dict) in Python Logging Delegation cls Change the content of the class Meta-Classes vs. Traditional name Change the class name OOP bases Add and remove base classes dict Inspect the content of the class Example: Logging with Meta-Classes

Meta-Classes

Guy Wiener

Introduction AOP A logger decorator Classes Generation Meta-Classes in Python def log(name, f): Logging Delegation def ret(*args): Meta-Classes print "enter", name vs. Traditional OOP f(*args) print "exit", name return ret Logging with Meta-Classes (cont’d)

Meta-Classes

Guy Wiener

Introduction A logger meta-class AOP Classes Generation Meta-Classes class Logged(type): in Python Logging def init (cls, name, bases, dict): Delegation type. init (cls, name, bases, dict) Meta-Classes vs. Traditional p = re.compile(cls. logmatch ) OOP for attr, item in dict.items(): if callable(item) and p.match(attr): setattr(cls, attr, log(attr, item)) Loggin with Meta-Classes (cont’d)

Meta-Classes

Guy Wiener A logged class

Introduction AOP Classes class Test: Generation metaclass = Logged Meta-Classes in Python logmatch = ’.*’ Logging Delegation def foo(self): Meta-Classes print ’foo’ vs. Traditional OOP >>> t = Test() >>> t.foo() enter foo foo exit foo Automatic Delegation

Meta-Classes

Guy Wiener Delegate Introduction AOP Classes Generation Meta-Classes An object of class A that in Python Logging dispatches all message of Delegation class B to a target field Meta-Classes vs. Traditional of type B. OOP

Writting a delegate class is a monotonous work But it can be done automatically Delegation Using Meta-Classes

Meta-Classes A delegation function decorator Guy Wiener

Introduction AOP def dlgt(cls, method): Classes Generation def ret(self, *args): Meta-Classes method(self.__tgt__, *args) in Python Logging return instancemethod(ret, None, cls) Delegation Meta-Classes vs. Traditional OOP instancemethod takes a function, an object/ None and a class and returns a method of the class Auxiliary – Print class name

def clsname(self): return self.__class__.__name__ Delegation Using Meta-Classes (cont’d)

Meta-Classes

Guy Wiener

Introduction The Delegate meta-class AOP Classes Generation Meta-Classes class Delegate(type): in Python def __init__(cls, name, bases, dict): Logging Delegation type.__init__(name, bases, dict) Meta-Classes vs. Traditional tgtclass = cls.__tgtclass__ OOP for name in dir(tgtclass): val = getattr(tgtclass, name) if callable(val): setattr(cls, name, dlgt(cls, val)) Delegation Using Meta-Classes (cont’d)

Meta-Classes

Guy Wiener

Introduction AOP Classes The delegated class Generation Meta-Classes in Python Logging class A: Delegation def bar(self): Meta-Classes vs. Traditional print clsname(self), ’bar’ OOP def baz(self): print clsname(self), ’baz’ Delegation Using Meta-Classes (cont’d)

Meta-Classes

Guy Wiener

Introduction The delegating class AOP Classes Generation Meta-Classes class B: in Python Logging metaclass = Delegate Delegation tgtclass = A Meta-Classes vs. Traditional def init (self, tgt): OOP self. tgt = tgt def boo(self): print clsname(self), ’boo’ Delegation Using Meta-Classes (cont’d)

Meta-Classes

Guy Wiener

Introduction Delegation test AOP Classes Generation Meta-Classes >>> b = B(A()) in Python Logging >>> b.bar() Delegation Meta-Classes A bar vs. Traditional OOP >>> b.baz() A baz >>> b.boo() B boo Simplified Syntax for Meta-Classes with Parameters Thanks to Yoav Goldberg

Meta-Classes

Guy Wiener

Introduction Use a function to create the meta-class AOP Classes Generation def delegate_of(tgtclass): Meta-Classes in Python class Delegate(type): Logging Delegation def __init__(cls, name, bases, dict): Meta-Classes type.__init__(name, bases, dict) vs. Traditional OOP for name in dir( tgtclass): val = getattr( tgtclass, name) if callable(val): setattr(cls, name, dlgt(cls,val)) Simplified Syntax for Meta-Classes with Parameters Thanks to Yoav Goldberg

Meta-Classes

Guy Wiener

Introduction AOP Use the function to generate a meta-class Classes Generation Meta-Classes in Python class B: Logging Delegation metaclass = delegate_of(A) Meta-Classes def init (self, tgt): vs. Traditional OOP self. tgt = tgt def boo(self): print clsname(self), ’boo’ Outline

Meta-Classes

Guy Wiener

Introduction AOP Classes Generation 1 Introduction Meta-Classes in Python Logging 2 Meta-Classes in Python Delegation Meta-Classes vs. Traditional OOP 3 Meta-Classes vs. Traditional OOP Meta-Classes Changes OOP

Meta-Classes

Guy Wiener Meta-Classes introduces a change to the traditional OOP:

Introduction AOP Traditional OOP Objects are instances of classes Classes Generation OOP with meta-classes Classes are instances of classes too Meta-Classes in Python Logging Delegation Meta-Classes vs. Traditional OOP

Figure: Delegate class diagram Figure: Class diagram with meta-classes Meta-Classes Pros and

Meta-Classes

Guy Wiener Pros Cons Introduction AOP Classes Implementing aspects Adds a new level of Generation Meta-Classes becomes trivial complexity to OOP in Python Logging A less vulgar form of Requires hash-based Delegation code generation classes Meta-Classes vs. Traditional New reuse Breaks many things: OOP opportunities: Static types Design patterns Control flow analysis Static members IDE auto-completion Class hierarchies ...... Difficult to test Cool