contract model-view<V> { \c{\fbox{MV(C)}}
subject : model supports [
state : V;
value( val : V ) \$|->\$ [state = val]; notify();
notify() \$|->\$ \$\forall v \e \$views \bl v.update();
attach( v : view ) \$|->\$ v \$\e\$ views;
detach( v : view ) \$|->\$ v \$\not\e\$ views;
]
views : set<view> where view supports [
update() \$|->\$ [view reflects state];
subject( m : model ) \$|->\$ subject = m;
]
invariant:
\$\forall\$ v \$\e\$ views \bl [v reflects subject.state]
instantiation:
\$\forall\$ v \$\e\$ views \bl subject.attach(v) & v.subject(subject);
subject.notify();
}
slide: The Model-View contract