{"action":"created","issue":{"url":"https://api.github.com/repos/gnugat/medio/issues/43","labels_url":"https://api.github.com/repos/gnugat/medio/issues/43/labels{/name}","comments_url":"https://api.github.com/repos/gnugat/medio/issues/43/comments","events_url":"https://api.github.com/repos/gnugat/medio/issues/43/events","html_url":"https://github.com/gnugat/medio/issues/43","id":61549360,"number":43,"title":"Validator","user":{"login":"gnugat","id":793185,"avatar_url":"https://avatars.githubusercontent.com/u/793185?v=3","gravatar_id":"","url":"https://api.github.com/users/gnugat","html_url":"https://github.com/gnugat","followers_url":"https://api.github.com/users/gnugat/followers","following_url":"https://api.github.com/users/gnugat/following{/other_user}","gists_url":"https://api.github.com/users/gnugat/gists{/gist_id}","starred_url":"https://api.github.com/users/gnugat/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/gnugat/subscriptions","organizations_url":"https://api.github.com/users/gnugat/orgs","repos_url":"https://api.github.com/users/gnugat/repos","events_url":"https://api.github.com/users/gnugat/events{/privacy}","received_events_url":"https://api.github.com/users/gnugat/received_events","type":"User","site_admin":false},"labels":[{"url":"https://api.github.com/repos/gnugat/medio/labels/feature","name":"feature","color":"84b6eb"},{"url":"https://api.github.com/repos/gnugat/medio/labels/help%20wanted","name":"help wanted","color":"159818"}],"state":"open","locked":false,"assignee":null,"milestone":{"url":"https://api.github.com/repos/gnugat/medio/milestones/4","html_url":"https://github.com/gnugat/medio/milestones/Stable","labels_url":"https://api.github.com/repos/gnugat/medio/milestones/4/labels","id":997431,"number":4,"title":"Stable","description":"Medio will be release in its stable version when it will be able to open a file and regenerate it.","creator":{"login":"gnugat","id":793185,"avatar_url":"https://avatars.githubusercontent.com/u/793185?v=3","gravatar_id":"","url":"https://api.github.com/users/gnugat","html_url":"https://github.com/gnugat","followers_url":"https://api.github.com/users/gnugat/followers","following_url":"https://api.github.com/users/gnugat/following{/other_user}","gists_url":"https://api.github.com/users/gnugat/gists{/gist_id}","starred_url":"https://api.github.com/users/gnugat/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/gnugat/subscriptions","organizations_url":"https://api.github.com/users/gnugat/orgs","repos_url":"https://api.github.com/users/gnugat/repos","events_url":"https://api.github.com/users/gnugat/events{/privacy}","received_events_url":"https://api.github.com/users/gnugat/received_events","type":"User","site_admin":false},"open_issues":2,"closed_issues":0,"state":"open","created_at":"2015-02-26T18:13:27Z","updated_at":"2015-03-14T10:30:43Z","due_on":null,"closed_at":null},"comments":2,"created_at":"2015-03-14T10:30:43Z","updated_at":"2015-03-14T12:46:38Z","closed_at":null,"body":"Create `Gnugat\\Medio\\Validator`, a service that have 0 to many `Gnugat\\Medio\\Validator\\Constraint` (interface to define) and a `validate` method.\r\nThis method takes a Model as argument, finds all the `Constraint` that supports it and execute them. It throws a `InvalidModelException`.\r\n\r\n> **Note**: `Validator` should be able to \"traverse\" the models. For example, if an array of `Method` is given, it should validate the first `Method`, then its first `Argument`, then its second, then the second `Method`, etc.\r\n\r\n`InvalidModelException` should have an array of constraint violation messages. Its message should contain all of those."},"comment":{"url":"https://api.github.com/repos/gnugat/medio/issues/comments/80426009","html_url":"https://github.com/gnugat/medio/issues/43#issuecomment-80426009","issue_url":"https://api.github.com/repos/gnugat/medio/issues/43","id":80426009,"user":{"login":"gnugat","id":793185,"avatar_url":"https://avatars.githubusercontent.com/u/793185?v=3","gravatar_id":"","url":"https://api.github.com/users/gnugat","html_url":"https://github.com/gnugat","followers_url":"https://api.github.com/users/gnugat/followers","following_url":"https://api.github.com/users/gnugat/following{/other_user}","gists_url":"https://api.github.com/users/gnugat/gists{/gist_id}","starred_url":"https://api.github.com/users/gnugat/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/gnugat/subscriptions","organizations_url":"https://api.github.com/users/gnugat/orgs","repos_url":"https://api.github.com/users/gnugat/repos","events_url":"https://api.github.com/users/gnugat/events{/privacy}","received_events_url":"https://api.github.com/users/gnugat/received_events","type":"User","site_admin":false},"created_at":"2015-03-14T12:46:38Z","updated_at":"2015-03-14T12:46:38Z","body":"Hi @funivan, I think we're talking about the same thing: When `Validator` is complete, I wanted to start creating a `ConcreteObjectMethodsCannotBeAbstract` constraint.\r\n\r\nHaving a `Validator` service would allow to do many checks in one call, here's a usage example:\r\n\r\n```php\r\n$validator = new Validator();\r\n$validator->addConstraint(new ConcreteObjectMethodsCannotBeAbstract());\r\n\r\n$validator->validate(new Object('Gnugat\\Medio\\MyConcreteClass'));\r\n```"}}