Frappe app cant call validate or similar controller hooks on custom module

I am trying to create a custom meeting app here on frappe 15.0

The following error occurred.

App Versions

{
	"erpnext": "15.0.0-dev",
	"frappe": "15.0.0-dev",
	"meeting": "0.0.1"
}

Route

Form/Meeting/new-meeting-xnyxrwvzdd

Traceback

Traceback (most recent call last):
  File "apps/frappe/frappe/handler.py", line 322, in run_doc_method
AttributeError: 'Meeting' object has no attribute 'validate'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "apps/frappe/frappe/app.py", line 110, in application
    response = frappe.api.handle(request)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "apps/frappe/frappe/api/__init__.py", line 49, in handle
    data = endpoint(**arguments)
           ^^^^^^^^^^^^^^^^^^^^^
  File "apps/frappe/frappe/api/v1.py", line 36, in handle_rpc_call
    return frappe.handler.handle()
           ^^^^^^^^^^^^^^^^^^^^^^^
  File "apps/frappe/frappe/handler.py", line 50, in handle
    data = execute_cmd(cmd)
           ^^^^^^^^^^^^^^^^
  File "apps/frappe/frappe/handler.py", line 86, in execute_cmd
    return frappe.call(method, **frappe.form_dict)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "apps/frappe/frappe/__init__.py", line 1673, in call
    return fn(*args, **newargs)
           ^^^^^^^^^^^^^^^^^^^^
  File "apps/frappe/frappe/handler.py", line 325, in run_doc_method
    is_whitelisted(fn)
            ^^^^^^^^^^
  File "apps/frappe/frappe/__init__.py", line 533, in msgprint
    _raise_exception()
  File "apps/frappe/frappe/__init__.py", line 487, in _raise_exception
    raise exc
AttributeError: An exception Occured'Meeting' object has no attribute 'validate'

Request Data

{
	"type": "POST",
	"args": {
		"docs": "{\"docstatus\":0,\"doctype\":\"Meeting\",\"name\":\"new-meeting-xnyxrwvzdd\",\"__islocal\":1,\"__unsaved\":1,\"owner\":\"Administrator\",\"naming_series\":\"Meeting-###\",\"meeting_name\":\"asdfas\"}",
		"method": "validate"
	},
	"headers": {},
	"error_handlers": {},
	"url": "/api/method/run_doc_method",
	"request_id": null
}

Response Data

{
	"exception": "AttributeError: An exception Occured'Meeting' object has no attribute 'validate'",
	"exc_type": "AttributeError",
	"_server_messages": "[\"{\\\"message\\\": \\\"An exception Occured'Meeting' object has no attribute 'validate'\\\", \\\"title\\\": \\\"Error\\\", \\\"indicator\\\": \\\"green\\\", \\\"raise_exception\\\": 1, \\\"__frappe_exc_id\\\": \\\"801184db0e2fd6dd43d8469ee745ca8c3543350206e99f5c5af63081\\\"}\"]"
}

validate is default controller hook. the same message when sent on a erpnext or other frappe app gives

Method Not Allowed

You are not permitted to access this resource.Function erpnext.stock.doctype.quality_inspection.quality_inspection.validate is not whitelisted.