I remember finding this confusing at first, but I guess it isn't really. I just hope I can explain it clearly :-) This is how I understand it:
Each template is 'managed' by a controller. Every property/method-call from within a template is answered by the boss controller. Within each template we can use <% control %> loops to iterate DataObjectSets, that consist of DataObjects.
Applying this to pages: each page type consists of two classes: a data model (the Page class, an extended DataObject) and a controller (the Page_Controller class). The controller controls the Page template. Fortunately these page controllers have built-in access to the data within their Page Datamodel - including your custom methods it seems :-).
Controller methods like Menu() and Children() however return DataObjectSets of pages that can then be looped in a control structure - and that's just it: they are Page DataObjects and not Controllers. So within a control loop you have access to the Page class itself meaning methods defined the controller are not available. Same goes for custom methods that return things like DataObject::get('SiteTree',..) results. Remedy this by adding appropriate methods to the data model (Page) class...