added 'prototype' pattern