using System.Collections.Generic;
public static string GetCfg() {
<cfg address='1009 Broad St.'>
<add name='Living' maximum-occupancy='12' />
<add name='Kitchen' maximum-occupancy='8' />
<add name='Bathroom' maximum-occupancy='2' />
public static void Main() {
var cfg = new Home(GetCfg());
Console.WriteLine("There are {0} errors.", cfg.Errors().Length);
Console.WriteLine("There are {0} rooms.", cfg.Rooms.Count);
Console.WriteLine("Before, this home can fit {0} people.", cfg.Rooms.Select(r=>r.MaximumOccupancy).Sum());
Console.WriteLine("---");
cfg = new Home(GetCfg(), new Multiplier(2));
Console.WriteLine("Now, this home can fit {0} people.", cfg.Rooms.Select(r=>r.MaximumOccupancy).Sum());
public Home(string cfg, params IDependency[] dependencies):base(dependencies){
public string Address {get;set;}
public List<Room> Rooms {get; set;}
public string Name {get; set;}
public int MaximumOccupancy {get; set;}
class Multiplier : ICustomizer {
private readonly int _multiplier;
public Multiplier(int multiplier){
_multiplier = multiplier;
public void Customize(string collection, INode node, IDictionary<string,string> parameters, ILogger logger){
if(collection != "rooms")
IAttribute maximumOccupancy;
if(node.TryAttribute("maximum-occupancy", out maximumOccupancy)){
if(int.TryParse(maximumOccupancy.Value.ToString(), out current)){
maximumOccupancy.Value = current * _multiplier;
public void Customize(INode root, IDictionary<string,string> parameters, ILogger logger){}