import std.stdio;

class Collection( Item )
{
    void add( Item item ) { }
	void addRange( Item[] items )
	{
		foreach( item ; items ) add( item );
	}
	void say( Message )( Message message )
	{
		writeln( "Collection says: " , message );
	}
}

class CollectionWithCounter( Item , CollectionInner = Collection!Item )
{
	private CollectionInner inner;
	alias inner this;

	private int count;

    this( CollectionInner inner = new CollectionInner )
	{
		this.inner = inner;
	}

	void add( Item item )
	{
		inner.add( item );
		count += 1;
	}

	void addRange( Item[] items )
	{
		inner.addRange( items );
		count += items.length;
	}
}

void main()
{
    auto foo = new CollectionWithCounter!int;

	foo.add(1);
	foo.add(2);
	foo.add(3);

	foo.addRange([ 1 , 2 , 3 ]);

	foo.say( foo.count );
}
