plugin 0.0.2

Lazily evaluated, order-independent plugins for extensible types.
extern crate plugin;
extern crate typemap;

use plugin::{Extensible, PluginFor, GetCached, Phantom};
use typemap::{TypeMap, Assoc};

struct Struct {
    map: TypeMap
}

impl Extensible for Struct {
    fn extensions(&self) -> &TypeMap {
        &self.map
    }
    fn extensions_mut(&mut self) -> &mut TypeMap {
        &mut self.map
    }
}

#[deriving(Clone, Show)]
struct Plugin {
    field: i32
}
impl Assoc<Plugin> for Plugin {}

impl PluginFor<Struct> for Plugin {
    fn eval(_: &mut Struct, _: Phantom<Plugin>) -> Option<Plugin> {
        Some(Plugin { field: 7i32 })
    }
}

fn main() {
    let mut x = Struct { map: TypeMap::new() };
    println!("{}", x.get_ref::<Plugin>());
}