# Record Brainstorm **Declaration**: ```typescript= type Book = QRecord< {library: number, id: number}, {description: string, isArchived: boolean}> export const Book_read = qrlHook(async (props: QProps<Book>): StateOf<Book> => { const data = await fetch('/some/api/' props.org + '/' + props.id); return { description: data.text }; }) export const Book_destroy = qrlHook<[QProps<Book>], StateOf<Book>>(async (props)=> { const data = await fetch('/some/api/' props.org + '/' + props.id); return { description: data.text }; }) const Book = qRecord<Book>({ maxCount: 100, type: 'Book', props: ['org', 'id'], onCreate: Book_create, onDestroy: Book_destroy, /* onMaterialize: Book_create, onRead: Book_read, onUpdate: Book_update, onDelete: Book_delete, */ }) async function Book_archive(book: Book) { book.state.archived = true; await book.writeQueue(); return; } ``` serialization: ```htmlembedded= <div ::book="{onCreate: 'chunk_abc#Book', ... }" ::book:123:456="{description: 'Some Title', isArchived: false}" ::book:234:567="{description: 'Other Title', isArchived: true}" ``` **Usage**: standalone: ```typescript= // Creating a new Book const book:Book = await Book.create( element, {library: 123, id:456}, // Maybe this can be omitted? {description: 'some text'}); // Retrieving existing book cost otherBookProp:QProps<Book> = qProps(element, {library: 234, id:567}); const book2:Book = await Book.read(otherBookProp); // update state book2.state.description = book.state.description; // State is proxy which will autodetect changes and: // 1. Notify all components of change. // 2. Fire Book_onChange message. // Wait until pending changes have been propagated. await book2.pendingChanges; console.log(book.props); console.log(book.state); console.log(book.transient); ``` as component: ```htmlembedded= <my-component q:view="chunk_abc#View" on:q-init="chunk_abc#state" on:q-destroy="chunk_abc#destroy" bind:book:123:456="book"> ``` ```typescript= type BookDetails = QComponent<{book: QProp<Book>}> const BookDetails_view = qrlView<BookDetails>((props, state) => ( <div> {state.description} </div> )); const MyComponent_init = qrlMessage((props:QProps<MyComponent>) => ({})); const MyComponent_destroy = qrlMessage(() => {console.log('destroy'); }); const MyComponent = qComponent<MyComponent>({ tag: 'book-details', onInit: MyComponent_init, onDestroy: MyComponent_destroy }) ```